proto3 map字段 自动生成的java类中没有对应的put方法解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| syntax = "proto3";
package userservice;
option java_package = "com.taobao.user"; option java_multiple_files = true; option java_outer_classname = "UserServiceProto";
service UserService {
rpc addUser(User) returns (Response) {}
rpc deleteUser(UserRequest) returns (Response) {}
rpc updateUser(User) returns (Response) {}
rpc getUser(UserRequest) returns (User) {}
}
message UserRequest { int32 id = 1; }
message User { map<string, string> contacts = 1; int32 id = 2; string name = 3; int32 age = 4; string email = 5; }
message Response { string state = 1; }
|
在使用proto3
生成Java类时,在User.java中的Builder类中没有putAllContacts()方法,而在proto3 doc中,说明了会生成该方法。(目前还不知道为什么不行)
可以使用下面的方式来添加内容。
1 2 3 4 5 6 7 8 9
| User.Builder builder = User.newBuilder(); builder.getMutableContacts().put("key", "value"); User user = builder .setId(1) .setName("mark") .setAge(23) .setEmail("xxx@taobao.com") .build(); client.addUser(user);
|
builder.getMutableContacts().put("key","value");
调用必须在builder.build()
方法之前调用,否则会出错。
调用builder.build()
方法将map设置为immutable.
调用builder.getMutableContacts()
会判断是否存在map,如果没有,就创建一个mutable map返回,如果存在则返回已存在的map的拷贝,对返回的map进行添加对user中的map无影响。